/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package logica;

import fisica.CapaFisica;
import fisica.VacunaFisica;
import hibernate.objeto.PeriodoAplicacionVacuna;
import hibernate.objeto.Vacuna;
import java.util.Vector;

/**
 *
 * @author Gonzalo
 */
public class VacunaLogica extends CapaLogica {

    /**
     * Agrega/modifica una persona a la base de datos.
     * @param datosVacuna Los datos de la vacuna a agregar
     * @param vacunaAModificar La vacuna a modificar
     * @return true si se agregó correctamente false en caso contrario
     */
    public static boolean agregarOModificarVacuna (Object[] datosVacuna,
            Vacuna vacunaAModificar) {
        vacunaAModificar = crearObjetoVacuna(datosVacuna, vacunaAModificar);

        if (vacunaAModificar != null) {
            return true;
        } else {
            return false;
        }
    }
    
    /**
     * Crea un objeto vacuna con los datos pasados por parámetro.
     * @param datosVacuna Los datos de la vacuna a crear
     * @param vacuna El objeto Vacuna a crear
     * @return El objeto Vacuna recién creado
     */
    private static Vacuna crearObjetoVacuna(Object[] datosVacuna,
            Vacuna vacuna) {

        Vacuna vacunaExistio =
                getVacunaPorNombreYPorEnBd(
                datosVacuna[CapaLogica.VACUNA_NOMBRE].
                toString(), 0);

        //Si esta dada como baja lógica se la reactiva para luego seeguir
        //modificándola
        if (vacuna != null &&
                vacunaExistio != null) {
            vacunaExistio.setEnBdVacuna(true);
            vacuna = vacunaExistio;
        }
        Vacuna retorno = vacuna;
        Vector<PeriodoAplicacionVacuna> periodosAplicacion =
                new Vector<PeriodoAplicacionVacuna>();

        for (int i = 0; i < datosVacuna.length; i++) {
            periodosAplicacion.add(new PeriodoAplicacionVacuna());
        }

        vacuna.setNombreVacuna(
            capitalizeFirstLetter(datosVacuna[CapaLogica.VACUNA_NOMBRE].
            toString()));
        boolean vacunaGuardada =
                CapaFisica.guardarOActualizarObjeto(vacuna);
        if (!vacunaGuardada) {
            retorno = null;
        } else {
            vacuna.setEnBdVacuna(true);
        }

        if (((Boolean)datosVacuna[CapaLogica.VACUNA_RECIEN_NACIDO])) {
            periodosAplicacion.elementAt(
                    VACUNA_RECIEN_NACIDO).setDescripcionPeriodoAplicacionVacuna(
                    "Recién nacido");
            periodosAplicacion.elementAt(
                    VACUNA_RECIEN_NACIDO).setVacuna(vacuna);
        }

        if (((Boolean)datosVacuna[CapaLogica.VACUNA_DOS_MESES])) {
            periodosAplicacion.elementAt(
                    VACUNA_DOS_MESES).setDescripcionPeriodoAplicacionVacuna(
                    "Dos meses");
            periodosAplicacion.elementAt(
                    VACUNA_DOS_MESES).setVacuna(vacuna);
        }

        if (((Boolean)datosVacuna[CapaLogica.VACUNA_CUATRO_MESES])) {
            periodosAplicacion.elementAt(
                    VACUNA_CUATRO_MESES).setDescripcionPeriodoAplicacionVacuna(
                    "Cuatro meses");
            periodosAplicacion.elementAt(
                    VACUNA_CUATRO_MESES).setVacuna(vacuna);
        }

        if (((Boolean)datosVacuna[CapaLogica.VACUNA_SEIS_MESES])) {
            periodosAplicacion.elementAt(
                    VACUNA_SEIS_MESES).setDescripcionPeriodoAplicacionVacuna(
                    "Seis meses");
            periodosAplicacion.elementAt(
                    VACUNA_SEIS_MESES).setVacuna(vacuna);
        }

        if (((Boolean)datosVacuna[CapaLogica.VACUNA_DOCE_MESES])) {
            periodosAplicacion.elementAt(
                 VACUNA_DOCE_MESES).setDescripcionPeriodoAplicacionVacuna(
                 "Doce meses");
            periodosAplicacion.elementAt(
                 VACUNA_DOCE_MESES).setVacuna(vacuna);
        }

        if (((Boolean)datosVacuna[CapaLogica.VACUNA_DIECIOCHO_MESES])) {
            periodosAplicacion.elementAt(
                    VACUNA_DIECIOCHO_MESES).setDescripcionPeriodoAplicacionVacuna(
                    "Dieciocho meses");
            periodosAplicacion.elementAt(
                    VACUNA_DIECIOCHO_MESES).setVacuna(vacuna);
        }

        if (((Boolean)datosVacuna[CapaLogica.VACUNA_SEIS_ANIOS])) {
            periodosAplicacion.elementAt(
                    VACUNA_SEIS_ANIOS).setDescripcionPeriodoAplicacionVacuna(
                    "Seis años");
            periodosAplicacion.elementAt(
                    VACUNA_SEIS_ANIOS).setVacuna(vacuna);
        }

        if (((Boolean)datosVacuna[CapaLogica.VACUNA_ONCE_ANIOS])) {
            periodosAplicacion.elementAt(
                    VACUNA_ONCE_ANIOS).setDescripcionPeriodoAplicacionVacuna(
                    "Once años");
            periodosAplicacion.elementAt(
                    VACUNA_ONCE_ANIOS).setVacuna(vacuna);
        }

        if (((Boolean)datosVacuna[CapaLogica.VACUNA_QUINCE_ANIOS])) {
            periodosAplicacion.elementAt(
                    VACUNA_QUINCE_ANIOS).setDescripcionPeriodoAplicacionVacuna(
                    "Quince años");
            periodosAplicacion.elementAt(
                    VACUNA_QUINCE_ANIOS).setVacuna(vacuna);
        }

        if (((Boolean)datosVacuna[CapaLogica.VACUNA_DIECISEIS_ANIOS])) {
            periodosAplicacion.elementAt(
                    VACUNA_DIECISEIS_ANIOS).setDescripcionPeriodoAplicacionVacuna(
                    "Dieciseis años");
            periodosAplicacion.elementAt(
                    VACUNA_DIECISEIS_ANIOS).setVacuna(vacuna);
        }

        if (((Boolean)datosVacuna[CapaLogica.VACUNA_CADA_DIEZ_ANIOS])) {
            periodosAplicacion.elementAt(
                    VACUNA_CADA_DIEZ_ANIOS).setDescripcionPeriodoAplicacionVacuna(
                    "Cada diez años");
            periodosAplicacion.elementAt(
                    VACUNA_CADA_DIEZ_ANIOS).setVacuna(vacuna);
        }

        if (((Boolean)datosVacuna[CapaLogica.
             VACUNA_PUERPERIO_O_POST_ABORTO_INMEDIATO])) {
            periodosAplicacion.elementAt(
                    VACUNA_PUERPERIO_O_POST_ABORTO_INMEDIATO)
                    .setDescripcionPeriodoAplicacionVacuna(
                    "Puerperio o post-aborto inmediato");
            periodosAplicacion.elementAt(
                    VACUNA_PUERPERIO_O_POST_ABORTO_INMEDIATO)
                    .setVacuna(vacuna);
        }

        for (int i = 0; i < periodosAplicacion.size(); i++) {
            if (periodosAplicacion.get(i).
                    getDescripcionPeriodoAplicacionVacuna() != null) {
                boolean periodoGuardado = CapaFisica.guardarOActualizarObjeto(
                        periodosAplicacion.elementAt(i));
                if (!periodoGuardado) {
                    retorno = null;
                } else {
                    periodosAplicacion.get(i).setEnBdPeriodoAplicacionVacuna(true);
                }

            }
        }

        return retorno;
    }

    /**
     * Retorna el objeto Vacuna según el id.
     *
     * @param id El id de la vacuna
     * @return El objeto Vacuna consultado, null si no existe
     */
    public static Vacuna getVacunaPorIdEnBd(int id){
        return VacunaFisica.getVacunaPorIdEnBd(id, true);
    }

    /**
     * Retorna el vector con los objetos Vacuna según el estado en la base
     * de datos.
     *
     * @param estado 0 si es baja lógica, 1 si aún activo
     * @return El vector de objetos Vacuna consultado
     */
    public static Vector<Vacuna> getVectorVacunaEnBd() {
        return VacunaFisica.getVectorVacunaPorEnBd(true);
    }

    /**
     * Retorna el vector de vacunas que un paciente tiene aplicadas.
     * 
     * @param idPaciente El id del paciente a consultar
     * @return El vector de objetos Vacuna consultado
     */
    public static Vector<Vacuna> getVectorVacunaPorIdPacienteEnBd(
            int idPaciente) {
        return VacunaFisica.getVectorVacunaPorIdPacientePorEnBd(idPaciente, true);
    }

    /**
     * Retorna el vector de las vacunas que ya fueron aplicadas al
     * paciente.
     * @param vectorVacunasExistentes Vector de objetos Vacuna que existen en el
     * sistema
     * @param vectorVacunasAplicadas Vector de las vacunas que el paciente posee
     * @return El vector de objetos vacunas que aún quedan por aplicarse al
     * paciente
     */
    public static Vector<Vacuna> getVectorVacunaNoAplicadas (Vector<Vacuna>
            vectorVacunasExistentes, Vector<Vacuna> vectorVacunasAplicadas) {
        Vector<Vacuna> retorno = new Vector<Vacuna>();
        for (int i = 0; i < vectorVacunasAplicadas.size(); i++) {
            for (Vacuna vacuna : vectorVacunasExistentes) {
                if (vacuna.getIdVacuna() ==
                        vectorVacunasAplicadas.get(i).getIdVacuna()) {
                    retorno.add(vacuna);
                }
            }

        }
        return retorno;
    }

    /**
     * Retorna el vector de las vacunas que todavía no fueron aplicadas al
     * paciente.
     * @param vectorVacunasExistentes Vector de objetos Vacuna que existen en el
     * sistema
     * @param vectorVacunasAplicadas Vector de las vacunas que el paciente posee
     * @return El vector de objetos vacunas que aún quedan por aplicarse al
     * paciente
     */
    public static Vector<Vacuna> getVectorVacunaAplicadas(Vector<Vacuna>
       vectorVacunasExistentes, Vector<Vacuna> vectorVacunasAplicadas) {
        Vector<Vacuna> retorno = VacunaLogica.getVectorVacunaEnBd();
        boolean borrar = false;
        for (int i = 0; i < vectorVacunasExistentes.size(); i++) {
            borrar = false;
            for (Vacuna vacuna : vectorVacunasAplicadas) {                
                if (vacuna.getIdVacuna()
                        == vectorVacunasExistentes.get(i).getIdVacuna()) {
                    borrar = true;
                }
            }
            if (borrar) {
                retorno.remove(i);
            }
        }
        return retorno;
    }

    /**
     * Retorna el objeto Vacuna según el nombre de la vacuna.
     *
     * @param nombreVacuna El nombre de la vacuna
     * @param estado 0 si es baja lógica, 1 si aún activo
     * @return El objeto Vacuna consultado, null si no existe
     */
    public static Vacuna getVacunaPorNombreYPorEnBd(String nombre, int estado) {
        return VacunaFisica.getVacunaPorNombreYEnBd(
                reemplazarUnApostrofoPorDosApostrofos(nombre), true);
    }

}
